package com.johann.leetcode;

public class T2_TwoNumSum {

    static class ListNode{
        int val;
        ListNode next;
        public ListNode() {
        }
        public ListNode(int val) {
            this.val = val;
        }
        public ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    static class Solution{
        public static ListNode twoNumSum(ListNode l1,ListNode l2){
            // 来一个判空校验
            if (l1 == null && l2 == null)  return null;
            // 定义一个 空的头结点 dummyNode
            ListNode dummy = new ListNode(0);
            // 定义一个 指针 用于滑动，开始的时候也指向dummy
            ListNode ptr = dummy;
            // 进位符号
            int flag =0;
            // 循环下去的条件 是 两链表不为空 或 进位不为0
            while (l1 != null || l2 != null || flag != 0) {
                int i = l1 != null ? l1.val : 0;
                int j = l2 != null ? l2.val : 0;
                int tmp = i+j+flag;
                ptr.next = new ListNode(tmp%10);
                // 进位符号赋值
                flag = tmp/10;
                // ptr指针向右滑动
                ptr = ptr.next;
                // 同样 l1 与 l2 也得滑动
                if (l1 !=null) {
                    l1 = l1.next;
                }
                if (l2!=null) {
                    l2 = l2.next;
                }
             }
            // 最后把dummyNode的下一个节点作为返回值
            return dummy.next;
        }

    }

    // 打印方法
    public static void printListNode(ListNode l){
        while (l != null ) {
            System.out.println(l.val);
            l = l.next;
        }
    }

    public static String print(ListNode l){
        StringBuilder sb = new StringBuilder();
        while (l!=null) {
            sb.append(l.val);
            l = l.next;
        }
        return sb.toString();
    }

    // 测试用例
    public static void main(String[] args) {
        ListNode a = new ListNode(2);
        ListNode b = new ListNode(4);
        ListNode c = new ListNode(3);
        a.next = b;
        b.next = c;

        ListNode x = new ListNode(5);
        ListNode y = new ListNode(6);
        ListNode z = new ListNode(4);
        x.next = y;
        y.next = z;
        ListNode listNode = Solution.twoNumSum(a, x);
        System.out.println(T2_TwoNumSum.print(listNode));

    }

}
